import re

import random
from datetime import datetime

from info.utils.response_code import RET, error_map
from info import rs
from info.utils.models import User
from info import db
from info.libs.captcha.pic_captcha import captcha
from info.modules.passport import passport_blu
from flask import request, abort, current_app, make_response, Response, jsonify, session
from info.utils.constants import SMS_CODE_REDIS_EXPIRES
from info.libs.yuntongxun.sms import CCP


@passport_blu.route('/get_img_code')
def get_img_code():
    # 获取参数
    img_code_id = request.args.get("img_code_id")

    # 校验参数
    if not img_code_id:
        return abort(403)

    # 生成图片验证码
    img_name, img_txt, img_bytes = captcha.generate_captcha()

    # 将验证码和ｋｅｙ保存到数据库
    try:
        rs.set("img_code_id" + img_code_id, img_txt, ex=SMS_CODE_REDIS_EXPIRES)
    except BaseException as e:
        current_app.logger.error(e)
        return abort(500)

    # 返回图片
    response = make_response(img_bytes)  # type:Response
    response.content_type = "image/jpeg"
    return response


@passport_blu.route('/get_sms_code', methods=['POST'])
def get_sms_code():
    # 获取参数
    img_code_id = request.json.get("img_code_id")
    mobile = request.json.get("mobile")
    img_code = request.json.get("img_code")
    # print(img_code,mobile,img_code_id)

    # 校验参数
    if not all([img_code_id, mobile, img_code]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    # if not re.match(r"1^[345678]\d{9}$",mobile):
    #     return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 根据ｋｅｙ值取出正确的验证码
    try:
        real_img_code = rs.get("img_code_id" + img_code_id)
    except BaseException as e:
        current_app.logger.errore(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # 校验图片验证码
    if img_code.upper() != real_img_code:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 判断用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg=error_map[RET.DATAEXIST])

    # 生成随机数
    random_num = "%04d" % random.randint(0, 9999)

    # 发送短信
    # response_code = CCP().send_template_sms(mobile,[random_num,SMS_CODE_REDIS_EXPIRES/60],1)
    # if response_code != 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])

    # 保存短信验证码
    try:
        rs.set("sms_code_id_" + mobile, random_num, ex=SMS_CODE_REDIS_EXPIRES)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # 返回ｊｓｏｎ
    current_app.logger.info("短信验证码:%s" % random_num)
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


@passport_blu.route('/register', methods=['POST'])
def register():
    # 获取参数
    sms_code = request.json.get("sms_code")
    mobile = request.json.get("mobile")
    password = request.json.get("password")
    # 校验参数
    # 校验是否缺少参数
    if not all([sms_code, mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 测试手机号是否正确
    # if not re.match(r"1^[345678]\d{9}$",mobile):
    #     return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    try:
        real_sms_code = rs.get("sms_code_id_" + mobile)
    except BaseException as e:
        current_app.logger.errore(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    if sms_code != real_sms_code:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 记录数据
    user = User()
    user.mobile = mobile
    # user.password_hash = password
    user.nick_name = mobile
    user.password = password
    db.session.add(user)
    try:
        db.session.commit()
    except BaseException as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
    # 使用session保持登陆状态
    session["user.id"] = user.id
    # 返回参数
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


# 行为　查询ｍｏｂｉｌｅ　ｐａｓｓｗｏｒｄ　信息　请求方式　ＰＯＳＴ 参数　ｍｏｂｉｌｅ　ｐａｓｓｗｏｒｄ 返回体ＪＳＯＮ
@passport_blu.route('/login', methods=['POST'])
def login():
    # 获取参数
    mobile = request.json.get("mobile")
    password = request.json.get("password")

    # 校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])
    # 查询账号密码是否匹配
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])
    if not user:
        return jsonify(errno=RET.DATAERR, errmsg=error_map[RET.DATAERR])
    if not user.check_passoword(password):
        return jsonify(errno=RET.DATAERR, errmsg=error_map[RET.DATAERR])

    # 使用ｓｅｓｓｉｏｎ保持登陆状态
    session["user_id"] = user.id

    # 记录用户最后登陆的时间
    user.last_login = datetime.now()

    # 返回ＪＳＯＮ
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])

# 行为删除ｓｅｓｓｉｏｎ　参数　无　请求方式　ｐｏｓｔ　返回　ｊｓｏｎ
@passport_blu.route('/logout')
def logout():
    session.pop("user_id",None)
    session.pop("is_admin",None)
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])